/**
 * js面向对象基础
 * 一、概念
 * 二、js对象创建
 *    6中创建方法
 *     （1）字面量
 *     （2）构造函数创建
 *     （3）class类创建
 *     （4）new Object()
 *     （5）Object.create()
 *     （6）工厂类方法创建对象
 *     （7）原型创建对象
 *     （8）混合模式创建对象
 * 三、js对象继承
*      （1）原型继承
*      （2）构造方法继承
*      （3）混合模式继承
*      （4）es6 class继承
 * 四、js对象克隆
 *     4.1、深克隆
 *     4.2、浅克隆
 * 五、js对类型判断
 */
/**
 * 1、字面量创建类
 * 缺点：1、复用性差，产生大量重复代码
 * 
 const Person = {
    name: "小明",
    age:23
}
*/

/**
 * 2、构造函数创建类
 * @param {*} name 
 * @param {*} age 
 * 缺点：每个实例都包含不同的方法，函数是方法，函数也是对象
 function Person(name,age) { 
    this.name = name
    this.age = age
    this.run = function () {
        console.log("")
    }
}
  const person = new Person("小明",23)
 */

/**
 * 3、new Object()创建对象
 * 缺点：1、不能区分公有私有实例。
 *       2、对象不能识别
 * 
    const person = new Object()
    person.name = "小明"
    person.age = 23
    person.run = function () {
        console.log("")
    } 
*/

/**
 * 4.Object.create()
 * 缺点：1、不能区分公有私有实例。
 *       2、对象不能识别
 * 
 const person = {
    name:"小明",
    age:23,
    run:function () {
        console.log("")
    }
 };
 const me = Object.create(person);
 */

/**
 * 5、工厂方法创建对象
 * 缺点：1、对象不能识别
 * @param {*} name 
 * @param {*} age 
 * @returns 
 function factory(name, age) { 
   const obj = new Object()
   obj.name = "小明"
   obj.age = 23
   obj.run = function () {
       console.log("")
   }
   return obj
 } 
 const person = factory("小明",23)
 */

/**
 * 6、原型创建对象
 * 缺点：所有实例共享实例方法
 * 
    function Person() { }
    Person.prototype.name = "小明"
    Person.prototype.age = 23
    Person.prototype.run = function () {
        console.log("--------------------")
    } 
 */

/**
 * 7、公共方法和属性挂载在原型上
 *    私有变量放在构造函数上
 * @param {*} name 
 * @param {*} age 
 */
function Person(name, age) {
    this.name = name
    this.age = age
    this.run = function () {
        console.log("")
    }
}

Person.prototype = {
    constructor: Person,
    id: "0000",
    say: function () {
        console.log("说话")
    }
}
const person = new Person("小明", 23)
console.log("person:", person) //Person {name: '小明', age: 23}age: 23name: "小明"[[Prototype]]: Object
